AWS Amplify Gen1 で作成される S3 バケットにライフサイクルルールを追加してみた

AWS Amplify Gen1 で作成される S3 バケットにライフサイクルルールを追加してみた

Clock Icon2024.10.30

いわさです。

AWS Amplify Gen1 ではバックエンドリソースを Amplify 上で管理することが出来ます。
amplify add storageコマンドを使うことで、簡単に S3 バケットなどを追加することが出来るのですが、そのバケットをカスタマイズしたい場合はみなさんどうされていますでしょうか。

Amplify によってデプロイされた後にマネジメントコンソールからカスタマイズすることも出来るのですが、本日は Amplify コード上で S3 バケットのカスタマイズを行ってみましたのでその様子を紹介します。
Amplify Gen 2 で CDK ベースになったことでカスタマイズの柔軟性が上がったと言われていますが、実は Gen1 のころから CDK L1 ベースでのカスタマイズは出来ます。

カスタマイズ方法

実現方法ですがamplify override <category>でリソースオーバーライド用のカスタムリソースを作成してやります。
ストレージであればamplify override storageです。

https://docs.amplify.aws/gen1/react/build-a-backend/storage/modify-amplify-generated-resources/

そうすると、amplify/backendフォルダのカテゴリごとにoverrides.tsファイルが生成されるので、そこにカスタマイズしたい内容を TypeScript ベースで実装します。
そしてamplify pushされたタイミングでそのカスタマイズコードがビルドされ、CloudFormation テンプレートがカスタマイズ内容で更新され、デプロイされるという流れです。

S3 バケットにライフサイクルルールを追加してみる

今回は S3 バケットにライフサイクルルールを追加してみたいと思います。
なお、実行環境はクリーンな環境で試したかったので Cloud9 を使っています。

割愛しますが、適当な React アプリケーションに Amplify をインストールし、S3 ストレージを追加してクラウドへのプッシュまで完了しています。
この時点での Amplify 管理のストレージはデフォルトでは次のようにライフサイクルルールは設定されていない状態です。

74636B08-A75A-4B85-AE88-19DB24EF82D1.png

まずはamplify override storageコマンドを実行します。

cm-iwasa.takahito:~/environment/vite-project $ amplify override storage
✅ Successfully generated "override.ts" folder at /home/ec2-user/environment/vite-project/amplify/backend/storage/s3beaa8e2b
✔ Do you want to edit override.ts file now? (Y/n) · yes
Could not find selected code editor (Visual Studio Code) on your machine.
? Try opening with system-default editor instead? Yes
Unable to open /home/ec2-user/environment/vite-project/amplify/backend/storage/s3beaa8e2b/override.ts: spawn xdg-open ENOENT
Have you installed `xdg-utils` on your machine?
? Press enter to continue 

そうすると次のようにoverride.tsというファイルが作成されると思います。
ここで L1 コンストラクトを操作してやることで Amplify が自動生成してデプロイする CloudFormation に反映されるようになります。

B56C3FFC-DD62-41B2-99B3-FACFB0A716D9.png

ここでは以下を参考にライフサイクルの構成を追加してみました。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.CfnBucket.LifecycleConfigurationProperty.html

amplify/backend/storage/s3beaa8e2b/override.ts
import { AmplifyProjectInfo, AmplifyS3ResourceTemplate } from '@aws-amplify/cli-extensibility-helper';

export function override(resources: AmplifyS3ResourceTemplate, amplifyProjectInfo: AmplifyProjectInfo) {
    resources.s3Bucket.lifecycleConfiguration = {
        rules: [
            {
                status: 'Enabled',
                id: 'hogerule1',
                expirationInDays: 10,
                prefix: '/'
            }
        ]
    }
}

定義したらamplify pushしてやるだけです。これは中々良い感じだ。

cm-iwasa.takahito:~/environment/vite-project $ amplify push
✔ Successfully pulled backend environment dev from the cloud.

    Current Environment: dev
    
┌──────────┬─────────────────────┬───────────┬───────────────────┐
│ Category │ Resource name       │ Operation │ Provider plugin   │
├──────────┼─────────────────────┼───────────┼───────────────────┤
│ Storage  │ s3beaa8e2b          │ Update    │ awscloudformation │
├──────────┼─────────────────────┼───────────┼───────────────────┤
│ Auth     │ viteproject64432aca │ No Change │ awscloudformation │
└──────────┴─────────────────────┴───────────┴───────────────────┘
✔ Are you sure you want to continue? (Y/n) · yes

Deployment completed.
Deploying root stack viteproject [ ===========================------------- ] 2/3
        amplify-viteproject-dev-17fe4  AWS::CloudFormation::Stack     UPDATE_IN_PROGRESS             Wed Oct 30 2024 00:41:36…     
        storages3beaa8e2b              AWS::CloudFormation::Stack     UPDATE_COMPLETE                Wed Oct 30 2024 00:42:14…     
        authviteproject64432aca        AWS::CloudFormation::Stack     UPDATE_COMPLETE                Wed Oct 30 2024 00:41:43…     
Deployed storage s3beaa8e2b [ ======================================== ] 7/7
        S3Bucket                       AWS::S3::Bucket                UPDATE_IN_PROGRESS             Wed Oct 30 2024 00:41:44…     

Deployment state saved successfully.

amplify pushを行うと、Amplify がバックエンドをデプロイするための CloudFormation テンプレートが自動生成されてデプロイされます。そのテンプレートを確認してみましょう。

{
  "Description": "S3 Resource for AWS Amplify CLI",
  "AWSTemplateFormatVersion": "2010-09-09",
 
:

  "Resources": {
    "S3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": {
          "Fn::If": [
            "ShouldNotCreateEnvResources",
            {
              "Ref": "bucketName"
            },
            {
              "Fn::Join": [
                "",
                [
                  {
                    "Ref": "bucketName"
                  },
                  {
                    "Fn::Select": [
                      3,
                      {
                        "Fn::Split": [
                          "-",
                          {
                            "Ref": "AWS::StackName"
                          }
                        ]
                      }
                    ]
                  },
                  "-",
                  {
                    "Ref": "env"
                  }
                ]
              ]
            }
          ]
        },
        "CorsConfiguration": {
          "CorsRules": [
            {
              "AllowedHeaders": [
                "*"
              ],
              "AllowedMethods": [
                "GET",
                "HEAD",
                "PUT",
                "POST",
                "DELETE"
              ],
              "AllowedOrigins": [
                "*"
              ],
              "ExposedHeaders": [
                "x-amz-server-side-encryption",
                "x-amz-request-id",
                "x-amz-id-2",
                "ETag"
              ],
              "Id": "S3CORSRuleId1",
              "MaxAge": 3000
            }
          ]
        },
        "LifecycleConfiguration": {
          "Rules": [
            {
              "ExpirationInDays": 10,
              "Id": "hogerule1",
              "Prefix": "/",
              "Status": "Enabled"
            }
          ]
        }
      },
      "UpdateReplacePolicy": "Retain",
      "DeletionPolicy": "Retain"
    },

:

  }
}

LifecycleConfigurationが設定されていますね。良いぞ。
マネジメントコンソールからバケット構成も確認してみます。

10D64D3E-F019-4F43-8A24-76300C1CC24E.png

ライフサイクルルールが設定されていますね。10 日になってます。

505502A3-D6B1-4E0D-8BDB-AF0C3AE6BA84.png

さいごに

本日は AWS Amplify Gen1 で作成される S3 バケットにライフサイクルルールを追加してみました。

Gen2 を使っている方ももう多いと思いますが、Gen1 で Amplify 生成リソースをもう少しカスタマイズしたい場合はこちらの方法も検討してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.